package br.com.lucasddaniel.merchanmobile.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;
import java.util.List;

import android.content.Context;
import android.os.Environment;
import br.com.lucasddaniel.merchanmobile.bean.PacoteArquivoBean;
import br.com.lucasddaniel.merchanmobile.bean.PasseioBean;
import br.com.lucasddaniel.merchanmobile.bean.TuristaBean;
import br.com.lucasddaniel.merchanmobile.dao.ExcessaoBanco;
import br.com.lucasddaniel.merchanmobile.dao.PasseioRepositorio;
import br.com.lucasddaniel.merchanmobile.dao.TuristaRepositorio;

/**
 * Classe de acesso ao arquivo a ser importado e exportado.
 * 
 * @author ldsm
 * 
 */
public class ArquivoRepositorio {

    private static final String SEPARADOR = ";";
    private TuristaRepositorio turistaRepositorio;
    private PasseioRepositorio passeioRepositorio;

    public ArquivoRepositorio() {
        turistaRepositorio = new TuristaRepositorio();
        passeioRepositorio = new PasseioRepositorio();
    }

    /**
     * Importa os dados para o banco a partir da leitura do arquivo .txt.
     * 
     * @return true se tudo terminar corretamente.
     * @throws FileNotFoundException
     * @throws IOException
     * @throws ExcessaoBanco
     */
    public boolean importarDados(Context ctx) throws FileNotFoundException, IOException, ExcessaoBanco {
        boolean retorno = false;
        File file = new File(Environment.getExternalStorageDirectory() + "/merchanmobile/turistas.txt");
        if (file.exists()) {
            turistaRepositorio.deletarTabela(ctx);
            retorno = true;
            BufferedReader br = new BufferedReader(new FileReader(file));
            String linha;
            Calendar cal = Calendar.getInstance();
            while ((linha = br.readLine()) != null) {
                int posicao = 1;
                TuristaBean tb = new TuristaBean();
                String[] lin = linha.split(SEPARADOR);
                if (lin.length == 1) {
                    cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(lin[0].split(":")[0]));
                    cal.set(Calendar.MINUTE, Integer.valueOf(lin[0].split(":")[1]));
                    continue;
                } else {
                    tb.setHoraChegada(cal.getTimeInMillis());
                    tb.setNumRegistro(lin[posicao++]);
                    tb.setVooIn(lin[posicao++]);
                    tb.setPousada(lin[posicao++]);
                    tb.setNome(lin[posicao++]);
                    tb.setQuantidade(Integer.valueOf(lin[posicao++]));
                    tb.setDataSaida(lin[posicao++]);
                    tb.setVooOut(lin[posicao++]);
                    tb.setObservacao(lin[posicao++]);
                    tb.setMotorista(lin[posicao++]);
                    tb.setOperador(lin[posicao++]);
                }
                turistaRepositorio.inserir(tb, ctx);
            }
            br.close();
            file.delete();
        } else {
            throw new FileNotFoundException("O arquivo turistas.txt não foi encontrado ou o sdcard foi removido.");
        }

        return retorno;
    }

    public void exportarDados(FileOutputStream out, Context ctx) throws IOException, ExcessaoBanco {
        for (PasseioBean passeio : passeioRepositorio.listar(ctx)) {

            out.write(montaArquivo(passeio, passeioRepositorio.buscarPacotes(passeio, ctx)));
            out.write("\n".getBytes());
        }
        out.close();

        turistaRepositorio.deletarTabela(ctx);
    }

    private byte[] montaArquivo(PasseioBean pas, List<PacoteArquivoBean> pacs) {
        StringBuffer retorno = new StringBuffer();
        // retorno.append(tur.getHora()+";;;;;;;;;;");
        retorno.append(pas.getDataHoraVenda() + ";");
        retorno.append(pas.getNomeTurista() + ";");
        retorno.append(pas.getNomeGuia() + ";");
        retorno.append(pas.getNomePousada() + ";");
        retorno.append(pas.getTipoDeMoeda() + ";");
        retorno.append(pas.getTotalGeral() + ";");
        retorno.append(pas.getSinal() + ";");
        retorno.append(pas.getDesconto() + ";");
        retorno.append(pas.getSaldoFinal() + ";");
        for (PacoteArquivoBean pac : pacs) {
            retorno.append(pac.getDataHoraSaida() + ";");
            retorno.append(pac.getNome() + ";");
            retorno.append(pac.getTransporte() + ";");
            retorno.append(pac.getQuantidade() + ";");
            retorno.append(pac.getTipoMoeda() + ";");
            retorno.append(pac.getTotal() + ";");
            if ("Real".equalsIgnoreCase(pac.getTipoMoeda())) {
                retorno.append(pac.getPreco() + ";");
            } else {
                retorno.append(pac.getPrecoDolar() + ";");
            }
        }

        return retorno.toString().getBytes();
    }
}
